package client;

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;
import java.nio.charset.StandardCharsets;

public class Client extends Thread {

	// 用一次的参数
	private boolean getWriter = false; // 申请BufferedWriter后变为true
	private boolean getOutputStream = false; // 申请outputStream后变为true
	
	private BufferedWriter writer = null; // 存储申请到的outputStream
	private FileOutputStream outputStream = null; // 存储申请到的outputStream
	
	private InetAddress address; // 用户地址

	private String message = ""; // 将要发出的消息
	private boolean haveMessage = false; // 有消息时转为true
	private boolean isFile = false; // 是否为文件信息

	private Socket sock; // 服务器socket

	// 构造方法: 传入客户端地址，自动连接服务器
	public Client(InetAddress n) throws UnknownHostException, IOException {
		this.address = n; // 用户地址
		sock = new Socket(address, 6666); // 以name连接服务器，此处服务器应立即返回在线人数信息
	}

	// 发信息线程，调用sendMessage开始发消息
	public void run() {
		try (OutputStream output = sock.getOutputStream()) {
			System.out.println("发送功能就绪就绪");

			while (true) {
				Thread.sleep(100);
				
				// 非文件传输
				if (!isFile) {

					// 没有初始化的时候才获取reader
					if(!getWriter) { 
						writer = new BufferedWriter(new OutputStreamWriter(output, StandardCharsets.UTF_8));
						getWriter = true;
					}
					Thread.sleep(100);
					// 有消息的时候发送
					if (haveMessage) {
						System.out.println("消息：" + message + "向服务器发送");
						writer.write(this.message); // 地址信息一起发
						writer.flush();
						System.out.println("发送成功");
						haveMessage = !haveMessage;
					}

				}
				
				// 文件传输
				else if (isFile) {
//					
					FileInputStream inputStream = new FileInputStream(message); // 文件所在位置
					if(!getOutputStream) {
						outputStream = (FileOutputStream) output;
						getOutputStream = true;
					}
					// 传输
					byte[] p = new byte[1024]; // 传输介质
					int n = 0;
					// 循环传输
					while ((n = inputStream.read(p)) != -1) {
						outputStream.write(p, 0, n); // 从0读到n
					}
					outputStream.flush();
					isFile = !isFile;
				}
				
			}
		} catch (IOException e) {
			System.out.println("发送失败");
			// TODO Auto-generated catch block
//			e.printStackTrace();
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

	}

	// 供MyJFrame使用的发送文件方法，传入文件路径、发送地址和文件大小
	public void sendFile(File path,String address, long length) throws InterruptedException {
		sendMessage("e"+address+length); // 首先传输指令、地址、文件大小
		Thread.sleep(100);
		// 传输文件的参数设置
		this.isFile = true;
		message = path.getAbsolutePath(); // 获取绝对路径的字符串
	}

	// 供MyJFrame使用的发送消息方法,传入消息
	public void sendMessage(String message) {
		this.message = message;
		this.haveMessage = true; // 有消息要发送
	}

	// 返回sock
	public Socket getSocket() {
		return this.sock;
	}

}
